package creationPattern.Singleton;

/**
 * 双重校验
 *      1、get方法里面判断两次是否为null；
 *      2、外层判断不空，就直接返回；
 *      3、外层判断空，就抢资源，抢到资源后还需要防止前面进去的线程已经创建了；
 */
public class Singleton_04 {
    // 1.私有构造方法
    private Singleton_04() {
    }

    // 2.创建私有的静态的全局对象
    // volatile 这个关键字可以保证变量的可见性，屏蔽指令重排序
    private volatile static Singleton_04 instance;

    // 3.给外部提供全局访问点
    public static Singleton_04 getInstance() {
        if (null == instance)
            synchronized (Singleton_04.class){
                // 抢到锁之后，第二次判断
                // 进入同步代码块的线程需要防止之前进来的线程创建对象，所以需要再判断一次；
                if (null == instance)
                    instance = new Singleton_04();
            }
        return instance;
    }
}
